package com.example.springbootmqdemo.servcie;

import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * Classname: OrderService
 * Description:
 *
 * @Author: Jam
 * @Create 2022/11/28 - 18:53
 * @Version 1.0
 */
@Service
public class OrderService {
    @Autowired
    RabbitTemplate rabbitTemplate;


    public void makeOrder(String userId, String productId, int num) {
        // 1: 定义交换机 要与配置类声明路由器的名字一样
        String exchangeName = "fanout_order_exchange";
        // 2: 路由key
        String routeKey = "";
        // 1： 模拟用户下单
        String orderNumer = UUID.randomUUID().toString();
        // 2: 根据商品id productId 去查询商品的库存
        // int numstore = productSerivce.getProductNum(productId);
        // 3:判断库存是否充足
        // if(num >  numstore ){ return  "商品库存不足..."; }
        // 4: 下单逻辑
        // orderService.saveOrder(order);
        // 5: 下单成功要扣减库存
        // 6: 下单完成以后
        System.out.println("用户 " + userId + ",订单编号是：" + orderNumer);
        // 发送订单信息给RabbitMQ fanout 参数1：路由器名字 参数2：路由key 参数3：消息实体message,此处仅为字符串orderNumer
        rabbitTemplate.convertAndSend(exchangeName, routeKey, orderNumer);
    }

    public void makeOrderDirect(String userId, String productId, int num) {
        // 1: 定义交换机 要与配置类声明路由器的名字一样
        String exchangeName = "direct_order_exchange";
        // 2: 路由key
        String routeKey = "";
        // 1： 模拟用户下单
        String orderNumer = UUID.randomUUID().toString();
        // 2: 根据商品id productId 去查询商品的库存
        // int numstore = productSerivce.getProductNum(productId);
        // 3:判断库存是否充足
        // if(num >  numstore ){ return  "商品库存不足..."; }
        // 4: 下单逻辑
        // orderService.saveOrder(order);
        // 5: 下单成功要扣减库存
        // 6: 下单完成以后
        System.out.println("用户 " + userId + ",订单编号是：" + orderNumer);
        // 发送订单信息给RabbitMQ fanout
        /*
         参数1：路由器名字
         参数2：路由key  与配置类中的绑定key 同步
         参数3：消息实体message,此处仅为字符串orderNumer
         */
        //给sms 发消息
        rabbitTemplate.convertAndSend(exchangeName, "sms", orderNumer);
        //给emall 发消息
        rabbitTemplate.convertAndSend(exchangeName, "emall", orderNumer);
    }

    public void makeOrderTopic (String userId, String productId, int num) {
        // 1: 定义交换机 要与配置类声明路由器的名字一样
        String exchangeName = "topic_order_exchange";
        // * 可以替代一个单词。 order.* 可以匹配 order.created 和 order.updated，但不能匹配 order 或 order.created.now。
        // # 可以替代零个或多个单词。order.# 可以匹配 order、order.created、order.updated、order.created.now，以及任何其他以 order 开头的路由键。
        // 2: 路由key    emall --> *.emall.#      sms --> "com.#"    weixin --> #.weixin.#
        String routeKey = "com.weixin.xxx"; //给微信和sms发
//        String routeKey2 = "com.emall.weixin.xxx"; //给短信和微信和sms发
        // 1： 模拟用户下单
        String orderNumer = UUID.randomUUID().toString();
        // 2: 根据商品id productId 去查询商品的库存
        // int numstore = productSerivce.getProductNum(productId);
        // 3:判断库存是否充足
        // if(num >  numstore ){ return  "商品库存不足..."; }
        // 4: 下单逻辑
        // orderService.saveOrder(order);
        // 5: 下单成功要扣减库存
        // 6: 下单完成以后
        System.out.println("用户 " + userId + ",订单编号是：" + orderNumer);
        // 发送订单信息给RabbitMQ fanout
        /*
         参数1：路由器名字
         参数2：路由key  与配置类中的绑定key 同步
         参数3：消息实体message,此处仅为字符串orderNumer
         */
        //给sms 发消息
//        rabbitTemplate.convertAndSend(exchangeName, "sms", orderNumer);
        //给emall 发消息
//        rabbitTemplate.convertAndSend(exchangeName, "emall", orderNumer);

        rabbitTemplate.convertAndSend(exchangeName, routeKey, orderNumer);
    }

    public void makeOrderTtl (String userId, String productId, int num) {
        // 1: 定义交换机 要与配置类声明路由器的名字一样
        String exchangeName = "ttl_direct_exchange";
        // 2: 路由key    emall --> *.emall.#      sms --> "com.#"    weixin --> #.weixin.#
        String routeKey = "ttl"; //给微信和sms发
//        String routeKey2 = "com.emall.weixin.xxx"; //给短信和微信和sms发
        // 1： 模拟用户下单
        String orderNumer = UUID.randomUUID().toString();
        // 2: 根据商品id productId 去查询商品的库存
        // int numstore = productSerivce.getProductNum(productId);
        // 3:判断库存是否充足
        // if(num >  numstore ){ return  "商品库存不足..."; }
        // 4: 下单逻辑
        // orderService.saveOrder(order);
        // 5: 下单成功要扣减库存
        // 6: 下单完成以后
        System.out.println("用户 " + userId + ",订单编号是：" + orderNumer);

        //给消息设置过期时间
        MessagePostProcessor   messagePostProcessor = new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setContentEncoding("UTF-8");
                message.getMessageProperties().setExpiration("4000");
                return message;
            }
        };


        // 发送订单信息给RabbitMQ
        /*
         参数1：路由器名字
         参数2：路由key  与配置类中的绑定key 同步
         参数3：消息实体message,此处仅为字符串orderNumer
         */
        rabbitTemplate.convertAndSend(exchangeName, "ttl", orderNumer);
        rabbitTemplate.convertAndSend(exchangeName, "ttlmessage", orderNumer,messagePostProcessor);
    }

    public void makeOrderAck (String userId, String productId, int num) {
        // 1: 定义交换机 要与配置类声明路由器的名字一样
        String exchangeName = "ttl_direct_exchange";
        // 2: 路由key    emall --> *.emall.#      sms --> "com.#"    weixin --> #.weixin.#
        String routeKey = "ttl"; //给微信和sms发
//        String routeKey2 = "com.emall.weixin.xxx"; //给短信和微信和sms发
        // 1： 模拟用户下单
        String orderNumer = UUID.randomUUID().toString();
        // 2: 根据商品id productId 去查询商品的库存
        // int numstore = productSerivce.getProductNum(productId);
        // 3:判断库存是否充足
        // if(num >  numstore ){ return  "商品库存不足..."; }
        // 4: 下单逻辑
        // orderService.saveOrder(order);
        // 5: 下单成功要扣减库存
        // 6: 下单完成以后
        System.out.println("用户 " + userId + ",订单编号是：" + orderNumer);
        // 发送订单信息给RabbitMQ fanout
        /*
         参数1：路由器名字
         参数2：路由key  与配置类中的绑定key 同步
         参数3：消息实体message,此处仅为字符串orderNumer
         */
        rabbitTemplate.convertAndSend(exchangeName, "ttl", orderNumer);
    }
}
